/*
 *  Copyright 2011 Yuri Kanivets
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package kankan.wheel.widget.adapters;

import android.content.Context;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import dev.drsoran.moloko.R;


/**
 * Abstract wheel adapter provides common functionality for adapters.
 */
public abstract class AbstractWheelTextAdapter extends AbstractWheelAdapter
{
   
   /** Text view resource. Used as a default view for adapter. */
   public static final int TEXT_VIEW_ITEM_RESOURCE = -1;
   
   /** No resource constant. */
   protected static final int NO_RESOURCE = 0;
   
   /** Default text color */
   public static final int LABEL_COLOR = 0xFF700070;
   
   private int textAppearanceResId;
   
   // Current context
   protected Context context;
   
   // Layout inflater
   protected LayoutInflater inflater;
   
   // Items resources
   protected int itemResourceId;
   
   protected int itemTextResourceId;
   
   // Empty items resources
   protected int emptyItemResourceId;
   
   
   
   /**
    * Constructor
    * 
    * @param context
    *           the current context
    */
   protected AbstractWheelTextAdapter( Context context )
   {
      this( context, TEXT_VIEW_ITEM_RESOURCE );
   }
   
   
   
   /**
    * Constructor
    * 
    * @param context
    *           the current context
    * @param itemResource
    *           the resource ID for a layout file containing a TextView to use when instantiating items views
    */
   protected AbstractWheelTextAdapter( Context context, int itemResource )
   {
      this( context, itemResource, NO_RESOURCE );
   }
   
   
   
   /**
    * Constructor
    * 
    * @param context
    *           the current context
    * @param itemResource
    *           the resource ID for a layout file containing a TextView to use when instantiating items views
    * @param itemTextResource
    *           the resource ID for a text view in the item layout
    */
   protected AbstractWheelTextAdapter( Context context, int itemResource,
      int itemTextResource )
   {
      this.context = context;
      itemResourceId = itemResource;
      itemTextResourceId = itemTextResource;
      
      inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
      
      textAppearanceResId = R.style.WheelTextAppearance;
   }
   
   
   
   public int getTextAppearanceResId()
   {
      return textAppearanceResId;
   }
   
   
   
   public void setTextAppearanceResId( int textAppearanceResId )
   {
      this.textAppearanceResId = textAppearanceResId;
   }
   
   
   
   /**
    * Gets resource Id for items views
    * 
    * @return the item resource Id
    */
   public int getItemResource()
   {
      return itemResourceId;
   }
   
   
   
   /**
    * Sets resource Id for items views
    * 
    * @param itemResourceId
    *           the resource Id to set
    */
   public void setItemResource( int itemResourceId )
   {
      this.itemResourceId = itemResourceId;
   }
   
   
   
   /**
    * Gets resource Id for text view in item layout
    * 
    * @return the item text resource Id
    */
   public int getItemTextResource()
   {
      return itemTextResourceId;
   }
   
   
   
   /**
    * Sets resource Id for text view in item layout
    * 
    * @param itemTextResourceId
    *           the item text resource Id to set
    */
   public void setItemTextResource( int itemTextResourceId )
   {
      this.itemTextResourceId = itemTextResourceId;
   }
   
   
   
   /**
    * Gets resource Id for empty items views
    * 
    * @return the empty item resource Id
    */
   public int getEmptyItemResource()
   {
      return emptyItemResourceId;
   }
   
   
   
   /**
    * Sets resource Id for empty items views
    * 
    * @param emptyItemResourceId
    *           the empty item resource Id to set
    */
   public void setEmptyItemResource( int emptyItemResourceId )
   {
      this.emptyItemResourceId = emptyItemResourceId;
   }
   
   
   
   /**
    * Returns text for specified item
    * 
    * @param index
    *           the item index
    * @return the text of specified items
    */
   protected abstract CharSequence getItemText( int index );
   
   
   
   @Override
   public View getItem( int index, View convertView, ViewGroup parent )
   {
      if ( index >= 0 && index < getItemsCount() )
      {
         if ( convertView == null )
         {
            convertView = getView( itemResourceId, parent );
         }
         TextView textView = getTextView( convertView, itemTextResourceId );
         if ( textView != null )
         {
            CharSequence text = getItemText( index );
            if ( text == null )
            {
               text = "";
            }
            textView.setText( text );
            
            if ( itemResourceId == TEXT_VIEW_ITEM_RESOURCE )
            {
               configureTextView( textView );
            }
         }
         return convertView;
      }
      return null;
   }
   
   
   
   @Override
   public View getEmptyItem( View convertView, ViewGroup parent )
   {
      if ( convertView == null )
      {
         convertView = getView( emptyItemResourceId, parent );
      }
      if ( emptyItemResourceId == TEXT_VIEW_ITEM_RESOURCE
         && convertView instanceof TextView )
      {
         configureTextView( (TextView) convertView );
      }
      
      return convertView;
   }
   
   
   
   /**
    * Configures text view. Is called for the TEXT_VIEW_ITEM_RESOURCE views.
    * 
    * @param view
    *           the text view to be configured
    */
   protected void configureTextView( TextView view )
   {
      view.setTextAppearance( context, textAppearanceResId );
      view.setGravity( Gravity.CENTER );
      view.setLines( 1 );
   }
   
   
   
   /**
    * Loads a text view from view
    * 
    * @param view
    *           the text view or layout containing it
    * @param textResource
    *           the text resource Id in layout
    * @return the loaded text view
    */
   private TextView getTextView( View view, int textResource )
   {
      TextView text = null;
      try
      {
         if ( textResource == NO_RESOURCE && view instanceof TextView )
         {
            text = (TextView) view;
         }
         else if ( textResource != NO_RESOURCE )
         {
            text = (TextView) view.findViewById( textResource );
         }
      }
      catch ( ClassCastException e )
      {
         Log.e( "AbstractWheelAdapter",
                "You must supply a resource ID for a TextView" );
         throw new IllegalStateException( "AbstractWheelAdapter requires the resource ID to be a TextView",
                                          e );
      }
      
      return text;
   }
   
   
   
   /**
    * Loads view from resources
    * 
    * @param resource
    *           the resource Id
    * @return the loaded view or null if resource is not set
    */
   private View getView( int resource, ViewGroup parent )
   {
      switch ( resource )
      {
         case NO_RESOURCE:
            return null;
         case TEXT_VIEW_ITEM_RESOURCE:
            return new TextView( context );
         default :
            return inflater.inflate( resource, parent, false );
      }
   }
}
